#include<iostream>
#define f(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;

struct work{
    int step=1;      // 这里初始化问题导致了访问step=0的time，是0（实际上不存在），造成错误
    int times[25];
    int places[25];

    //
    int endtime=0;
};

int m,n;
work my_works[25];
int machine[25][10000]={0};
int step[405];

int my_flush(int line, int begin, int length){
    int i;
    for(i=begin;i<999999;i++){
        bool find=true;
        f(j,i,i+length-1){
            if(machine[line][j]==1)
            {
                find=false;
                break;
            }
        }
        if(find==true)
            break;
    }
    f(flusher, i, i+length-1)
    machine[line][flusher]=1;
    return i+length-1;
}

void insert(work&w){
    // 获取执行机器
    int machine=w.places[w.step];
    int time=w.times[w.step];
    int endtime=w.endtime;
    int end=my_flush(machine,endtime+1,time);
    w.step+=1;
    w.endtime=end;
}

int main(){
    cin>>m>>n;
    f(i,1,m*n)
        cin>>step[i];
    f(i,1,n)
        f(j,1,m){     // 这里的循环指针，赋值的时候就有问题。是j不是m
            cin>>my_works[i].places[j];
        }
    f(i,1,n)
        f(j,1,m){
            cin>>my_works[i].times[j];
        }

    f(i,1,m*n){       // 这里，传入参数落实不到位。传入了错误的参数，应该是数组指引的参数
        insert(my_works[step[i]]);
    }
    int maxval=0;
    f(i,1,n)
        maxval=max(maxval,my_works[i].endtime);
    cout<<maxval<<endl;
}

